home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / StaticTView.C < prev    next >
C/C++ Source or Header  |  1990-12-06  |  17KB  |  719 lines

  1. //$StaticTextView,LineMark$
  2. overload Swap;
  3.  
  4. #include "StaticTView.h"
  5. #include "String.h"
  6. #include "View.h"
  7. #include "BlankWin.h"
  8. #include "FixedStorage.h"
  9. #include "TextFormatter.h"
  10.  
  11. Rectangle gFitRect(cFit, cFit);
  12.  
  13. //---- class LineMark ------------------------------------------------------
  14.  
  15. MetaImpl0(LineMark);
  16.  
  17. int LineMark_lineChanged;
  18.  
  19. LineMark::LineMark(LineDesc ldesc, int pos, int len, eMarkState s)
  20.                                 : Mark(pos, len, s)
  21. {
  22.     ld = ldesc; 
  23. }
  24.  
  25. LineMark::~LineMark()
  26. {
  27. }
  28.  
  29. ostream& LineMark::DisplayOn (ostream&s)
  30.     Mark::DisplayOn(s);
  31.     return s << ld.lnAscent << "/" << ld.lnHeight; 
  32. }
  33.  
  34. void *LineMark::operator new(size_t sz)
  35. {
  36.     return MemPools::Alloc(sz);
  37. }
  38.  
  39. void LineMark::operator delete(void *vp)
  40. {
  41.     MemPools::Free(vp, sizeof(LineMark)); 
  42. }
  43.  
  44. //---- global functions --------------------------------------------------
  45.  
  46. int TextViewLineHeight(FontPtr fd, eSpacing sp)
  47.     return ((int) sp) * fd->Spacing() / 2;
  48. }
  49.  
  50. //----- StaticTextView Methods --------------------------------------------------
  51.  
  52. MetaImpl(StaticTextView, (TP(text), TE(just), TE(spacing), TB(wrap),
  53.     TB(drawViewBorder), TB(vertExtend), TB(horExtend), T(border),
  54.     T(nLines), TP(lines), TP(marks), 0));
  55.  
  56. StaticTextView::StaticTextView(EvtHandler *eh, Rectangle r, Text *t, eTextJust m, 
  57.       eSpacing sp, bool doWrap, TextViewFlags fl, Point b, int id) 
  58.                                 : View(eh,r,id) 
  59. {
  60.     Init(r, t, m, sp, doWrap, fl, b);
  61. }   
  62.  
  63. void StaticTextView::Init(Rectangle r, Text* t, eTextJust ej, eSpacing sp, 
  64.             bool doWrap, TextViewFlags flags, Point itsBorder)
  65. {
  66.     lines= new ObjArray(32);
  67.     contentRect= r;
  68.     text= t;
  69.     nextc= text->MakeIterator();
  70.     just= ej;
  71.     spacing= sp;
  72.     wrap= doWrap;
  73.     drawViewBorder= FALSE;
  74.     marks= new MarkList;
  75.     LineDesc ld;
  76.     lines->AtPut(0,new LineMark(ld)); //dummy
  77.     marks->Add((*lines)[0]);    
  78.     vertExtend= (contentRect.extent.y == cFit);
  79.     horExtend= (contentRect.extent.x == cFit);
  80.     border= itsBorder;
  81.     if (horExtend)
  82.     wrap= FALSE;
  83.     if (!wrap)
  84.     formatter= new SimpleFormatter(this);
  85.     else
  86.     formatter= new FoldingFormatter(this);
  87.     nLines= 0;
  88.     fixedSpacing.FromFont(text->GetFont());
  89.     formatter->Preemptive(FALSE);
  90.     ChangedAt(0);
  91.     formatter->Preemptive(TRUE);
  92.  
  93.     if ((flags & eTextViewVisMode) == eTextViewVisMode)
  94.     SetFlag(eTextViewVisMode);
  95.     if ((flags & eTextViewReadOnly) == eTextViewReadOnly)
  96.     SetFlag(eTextViewReadOnly);
  97.     if ((flags & eTextFormPreempt) == eTextFormPreempt)
  98.     SetFlag(eTextFormPreempt);
  99.     if ((flags & eTextFixedOrigin) == eTextFixedOrigin)
  100.     SetFlag(eTextFixedOrigin);
  101.     if ((flags & eTextViewNoBatch) == eTextViewNoBatch)
  102.     SetFlag(eTextViewNoBatch);
  103.     if ((flags & eTextFixedSpacing) == eTextFixedSpacing)
  104.     SetFlag(eTextFixedSpacing);
  105. }
  106.  
  107. bool StaticTextView::IsJustified(int endOfLine)
  108. {
  109.     return (just == eJustified && endOfLine != text->Size() &&
  110.         (*text)[endOfLine-1] != '\n' && (*text)[endOfLine-1] != '\r');
  111. }
  112.  
  113. StaticTextView::~StaticTextView()
  114. {
  115.     if (lines)
  116.     lines->FreeAll();
  117.     SafeDelete(formatter);
  118.     SafeDelete(marks);
  119.     SafeDelete(lines);
  120.     SafeDelete(nextc);
  121. }
  122.  
  123. void StaticTextView::Draw(Rectangle r)
  124. {
  125.     register int i, lh, bh;
  126.     int startAt= PointToLine(r.origin-GetInnerOrigin()); // r is in View coords
  127.     Ink *oldtextink= 0; 
  128.  
  129.     if (startAt >= nLines)
  130.     return;
  131.        
  132.     Point p= LineToPoint(startAt,TRUE) + GetInnerOrigin();
  133.     Rectangle lineRect(GetInnerOrigin().x, p.y-BaseHeight(startAt),
  134.                    GetInnerExtent().x, LineHeight(startAt));
  135.  
  136.     if (! Enabled()) {
  137.     oldtextink= port->textink; // hack
  138.     GrSetTextPattern(ePatGrey50);
  139.     }
  140.  
  141.     bh= BaseHeight(startAt);
  142.     for (i= startAt; ; i++) {
  143.     if (! r.Intersects(lineRect))
  144.         break;
  145.     DrawLine(p, i, lineRect, r);
  146.     if (i >= nLines-1)
  147.         break;
  148.     p.y+= (lh= LineHeight(i))-bh;
  149.     p.y+= (bh= BaseHeight(i+1));
  150.     lineRect.origin.y+= lh; 
  151.     }        
  152.     if (drawViewBorder) {
  153.     GrSetPenPattern(ePatGrey50);
  154.     GrSetPenSize(2);
  155.     GrStrokeRect (Rectangle (contentRect.origin,contentRect.extent));
  156.     }
  157.     if (! Enabled())
  158.     GrSetTextPattern(oldtextink);
  159. }
  160.  
  161. void StaticTextView::DrawLine (Point p,int i,Rectangle, Rectangle rr)
  162. {
  163.     int start= StartLine(i), end= EndLine(i);
  164.     bool justified= IsJustified(end);
  165.     
  166.     p.x+= FirstCharPos(start, end);
  167.     if (Isspace((*text)[end-1]) && !TestFlag(eTextViewVisMode))     
  168.     end= max(start, --end);
  169.     GrTextMoveto(p);
  170.     if (justified)
  171.     text->DrawTextJust(start, end, GetInnerExtent().x, p, rr);
  172.     else
  173.     text->DrawText(start, end, rr);
  174. }
  175.  
  176. void StaticTextView::SetFont(FontPtr fd)
  177. {
  178.     text->SetFont(fd);
  179.     Reformat();
  180. }
  181.  
  182. void StaticTextView::SetSpacing(eSpacing sp)
  183. {
  184.     spacing = sp;
  185.     Reformat();
  186. }
  187.  
  188. void StaticTextView::SetFormatter(TextFormatter *f)
  189. {
  190.     SafeDelete(formatter);
  191.     formatter= f;
  192. }
  193.  
  194. void StaticTextView::SetJust(eTextJust m)
  195. {
  196.     just = m;
  197.     Reformat();
  198. }
  199.  
  200. void StaticTextView::SetVisibleMode(bool m)
  201. {
  202.     SetFlag(eTextViewVisMode, m);
  203.     Reformat();
  204. }
  205.  
  206. bool StaticTextView::GetVisibleMode()
  207.     return TestFlag(eTextViewVisMode); 
  208. }
  209.  
  210. void StaticTextView::SetWordWrap(bool m)
  211.     if (wrap == m)
  212.     return;
  213.     wrap= m;
  214.     SafeDelete(formatter);
  215.     if (wrap)
  216.     formatter= new FoldingFormatter(this); 
  217.     else
  218.     formatter= new SimpleFormatter(this); 
  219.     Reformat();
  220. }
  221.  
  222. bool StaticTextView::GetWordWrap()
  223.     return wrap; 
  224. }
  225.  
  226. void StaticTextView::SetNoBatch(bool m)
  227. {
  228.     SetFlag(eTextViewNoBatch, m);
  229. }
  230.  
  231. bool StaticTextView::GetNoBatch()
  232.     return TestFlag(eTextViewNoBatch); 
  233. }
  234.  
  235. Text *StaticTextView::SetText(Text *t)
  236. {
  237.     Text *old= text;
  238.     text= t;   
  239.     nextc= text->MakeIterator();
  240.     Reformat();  
  241.     Send(GetId(), cPartReplacedText, 0);
  242.     return old;
  243. }
  244.  
  245. void StaticTextView::SetString(byte *str, int len)
  246. {
  247.     text->ReplaceWithStr(str, len);
  248.     Reformat();
  249.     Send(GetId(), cPartReplacedText, 0);  
  250. }
  251.  
  252. int StaticTextView::NumberOfLines()
  253. {
  254.     return nLines;
  255. }
  256.  
  257. void StaticTextView::StartFormatting()
  258. {
  259. }
  260.  
  261. void StaticTextView::Reformat()
  262. {
  263.     nLines= 0;
  264.     formatter->Preemptive(FALSE);
  265.     ChangedAt(0);
  266.     formatter->Preemptive(TRUE);
  267. }
  268.  
  269. //---- mark a line and return whether line changed
  270.  
  271. bool StaticTextView::MarkLine (int line,int start,int end,LineDesc *ld)
  272. {
  273.     LineMark *m = 0;
  274.     bool markChanged;
  275.  
  276.     if (TestFlag(eTextFixedSpacing)) {
  277.     LineDesc tmp= fixedSpacing;
  278.     fixedSpacing.Max(*ld);
  279.     if (!tmp.IsEqual(fixedSpacing))
  280.         ForceRedraw();
  281.     *ld= fixedSpacing;    
  282.     }
  283.  
  284.     if (line < lines->Size())   
  285.     m = MarkAtLine(line);
  286.  
  287.     if (m) {
  288.     markChanged = m->HasChanged(start,end-start) || line >= nLines;
  289.     m->ChangeMark(start,end-start,*ld);
  290.     ld->Reset();
  291.     return markChanged;
  292.     }    
  293.     m = new LineMark(*ld,start,end - start);
  294.     ld->Reset();
  295.     marks->Add(m);
  296.     lines->AtPutAndExpand(line,m);
  297.     return TRUE;
  298. }
  299.  
  300. void StaticTextView::MarkLineAsChanged (int line)
  301. {
  302.     LineMark *m = MarkAtLine(max(0,min(line,nLines-1)));
  303.     m->state = eStateChanged;   
  304. }
  305.  
  306. bool StaticTextView::SuspendFormatting()
  307. {
  308.     Token t= gWindow->ReadEvent(0);
  309.     if (t.Code != eEvtNone) {
  310.     gWindow->PushBackEvent(t);
  311.     return TRUE;
  312.     }
  313.     return FALSE;  
  314. }
  315.  
  316. void StaticTextView::SetExtent(Point p)
  317. {
  318.     if (p != contentRect.extent) {
  319.     View::SetExtent(p);
  320.     if (horExtend)
  321.         wrap= FALSE;
  322.     Reformat();
  323.     }
  324. }
  325.  
  326. Metric StaticTextView::GetMinSize()
  327. {
  328.     Reformat();
  329.     return Metric(GetExtent(), Base());
  330. }
  331.  
  332. int StaticTextView::Base()
  333. {
  334.     return LineToPoint(0, TRUE).y+border.y;
  335. }
  336.  
  337. void StaticTextView::Fit()
  338. {
  339.     Point newExtent(contentRect.extent);
  340.     Point newOrigin(contentRect.origin);
  341.     register int i, s, e;
  342.  
  343.     if (vertExtend) 
  344.     newExtent.y = LineToPoint(nLines).y + 2*border.y;
  345.  
  346.     if (horExtend) {
  347.     newExtent.x = 0;
  348.     for (i= 0; i < nLines; i++) {
  349.         s= StartLine(i);
  350.         e= EndLine(i);
  351.         newExtent.x = max(newExtent.x, text->TextWidth(s,e));
  352.         if (!TestFlag(eTextFixedOrigin)) {
  353.         // adjust origin
  354.         switch (just) {
  355.         case eCenter:
  356.             newOrigin.x = contentRect.origin.x + 
  357.                   (contentRect.extent.x-newExtent.x)/2;
  358.             break;
  359.         case eRight:
  360.             newOrigin.x = contentRect.origin.x + 
  361.                   (contentRect.extent.x-newExtent.x);
  362.             break;
  363.         }
  364.         }
  365.     }
  366.     newExtent.x += 2*border.x;
  367.     }
  368.  
  369.     // the height of the view is at least the height of one line
  370.     newExtent.y = max(newExtent.y,
  371.               TextViewLineHeight(text->GetFont(), spacing)+2*border.y);
  372.  
  373.     // invalidate difference Rects if necessary
  374.     if (newExtent.x < contentRect.extent.x || newExtent.y < contentRect.extent.y) {
  375.     Rectangle r[4], tmpRect;
  376.     // expanded by 4,0 to invalidate the caret
  377.     tmpRect= contentRect.Expand(Point(4,0)); // g++??
  378.     int n= Difference(r, tmpRect, Rectangle(newOrigin,newExtent));
  379.     for (int i= 0; i < n; i++) 
  380.         InvalidateRect(r[i]);
  381.     }   
  382.     if (newOrigin != contentRect.origin) {
  383.     View::SetOrigin(newOrigin);
  384.     if (TestFlag(eVObjLayoutCntl)) 
  385.         Control(GetId(), cPartOriginChanged, this);
  386.     Send(GetId(), cPartOriginChanged, this); 
  387.     }
  388.     if (newExtent != contentRect.extent) {
  389.     View::SetExtent(newExtent);
  390.     if (TestFlag(eTextFixedOrigin)) 
  391.        InvalidateRect(contentRect);
  392.     if (TestFlag(eVObjLayoutCntl)) 
  393.         Control(GetId(), cPartExtentChanged, this);
  394.     Send(GetId(), cPartExtentChanged, this); 
  395.     }    
  396. }
  397.  
  398. Point StaticTextView::LineToPoint (int n, bool basePoint, bool relative)
  399. {
  400.     register int i, y= 0;
  401.  
  402.     n= range(0, nLines, n);
  403.     for (i= 0; i < n; i++)
  404.     y+= LineHeight(i);
  405.  
  406.     if (basePoint)
  407.     y+= BaseHeight(n);
  408.     if (relative)
  409.     return Point(0, y);
  410.     return GetInnerOrigin() + Point(0, y);
  411. }
  412.  
  413. int StaticTextView::PointToLine(Point p) // p is in coordinates relative to contentRect
  414. {
  415.     register int line, y= 0, py= max(0, p.y), lh;
  416.     
  417.     for (line= 0; line < nLines; line++) {
  418.     if (y + (lh= LineHeight(line)) > py)
  419.         break;
  420.     y+= lh;
  421.     }
  422.     return (min(nLines, line));
  423. }
  424.  
  425. //---- map a point in view coordinates to line and character number
  426.  
  427. void StaticTextView::PointToPos(Point p, Point *viewPos, int *lineNo, int *charNo)
  428. {
  429.     int start, end, fx= 0, cx= 0, l= *lineNo; // ???
  430.  
  431.     l = PointToLine(p);
  432.     if (l >= nLines) {
  433.     l = nLines-1;
  434.     p.x = contentRect.extent.x;    // set to end of line
  435.     }
  436.     if (l < 0) {
  437.     l = 0;
  438.     p.x = 0;            // set to start of line
  439.     }
  440.     start  = StartLine(l);
  441.     end    = EndLine(l);
  442.  
  443.     fx = FirstCharPos (start,end);
  444.  
  445.     bool justified = IsJustified(end);
  446.  
  447.     // make new lines at end of line not selectable
  448.     if (end - start) {
  449.     if ((*text)[end-1] == '\n' || (*text)[end-1] == '\r')
  450.         end--;
  451.     if (wrap && (*text)[end-1] == ' ')
  452.         end--;
  453.     }
  454.     if (justified) 
  455.     text->JustifiedMap(start, end, GetInnerExtent().x, end, p.x-fx, charNo, &cx); 
  456.     else
  457.     text->Map(start, end, end, p.x-fx, charNo, &cx);
  458.     *lineNo = l;
  459.     *viewPos = Point(cx+fx,LineToPoint(l).y);
  460. }
  461.  
  462. int StaticTextView::CharToLine(int ch)
  463. {
  464.     //register int line;
  465.     //for (line= 0; line < nLines; line++)
  466.     //    if (EndLine(line) > ch) 
  467.     //        break;
  468.     //return max(0, min(line, nLines-1));
  469.     register int base, pos, last, s;
  470.     
  471.     base= pos= 0;
  472.     last= nLines-1;
  473.     
  474.     while (last >= base) { // binary search
  475.     pos= (base+last) / 2;
  476.     if (EndLine(pos) > ch && (s= StartLine(pos)) <= ch)
  477.         break;
  478.     if (StartLine(pos) > ch)
  479.         last= pos-1;
  480.     else
  481.         base= pos+1;
  482.     }
  483.     return max(0, min(pos, nLines-1));
  484. }
  485.  
  486. void StaticTextView::CharToPos (int charNo, int *lineNo, Point *viewPos, bool relative)
  487. {
  488.     int line, ch, start, end, x;
  489.     Point p;
  490.  
  491.     ch= min(max(0,charNo),text->Size()); // establish 0 <= ch <= size
  492.     line= CharToLine(ch);
  493.     p.y= LineToPoint(line).y;
  494.     if (line >= nLines && line > 0) { // beyound end of text
  495.     p.y-= LineHeight(line);
  496.     line= max(0,nLines-1);
  497.     }
  498.     start= StartLine(line);
  499.     end= EndLine(line);
  500.  
  501.     //-- find character position    
  502.     p.x= FirstCharPos (start,end);
  503.  
  504.     bool justified= IsJustified(end);
  505.     if (justified) 
  506.     text->JustifiedMap(start, end, GetInnerExtent().x, charNo, cMaxInt, 0, &x);
  507.     else
  508.     text->Map(start, end, charNo, cMaxInt, 0, &x);
  509.     *viewPos= p;
  510.     viewPos->x+= x;
  511.     if (!relative)
  512.     *viewPos += GetInnerOrigin();
  513.     *lineNo= line;
  514. }
  515.  
  516. #include "System.h"
  517.  
  518. static int hcacheline= -1 , hcachelh= 0;
  519.  
  520. int StaticTextView::LineHeight(int l)
  521. {
  522.     if (hcacheline != l) {
  523.     // hcacheline= l;
  524.     
  525.     hcachelh= TestFlag(eTextFixedSpacing) ? 
  526.         TextViewlh(spacing, fixedSpacing.lnHeight) :
  527.         l >= nLines ? 
  528.         OutOfRangeLineMetric(TRUE) :
  529.         TextViewlh(spacing, MarkAtLine(l)->ld.lnHeight);
  530.     }
  531.     return hcachelh;
  532. }
  533.     
  534. static int bcacheline= -1 , bcachelb= 0;
  535.  
  536. int StaticTextView::BaseHeight(int l)
  537. {
  538.     if (bcacheline != l) {
  539.     // bcacheline= l;
  540.     
  541.     bcachelb= TestFlag(eTextFixedSpacing) ? 
  542.         fixedSpacing.lnAscent :
  543.         l >=nLines ? 
  544.         OutOfRangeLineMetric(FALSE) : 
  545.         MarkAtLine(l)->ld.lnAscent;
  546.     }
  547.     return bcachelb;
  548. }
  549.  
  550. int StaticTextView::FirstCharPos (int from,int to)
  551. {
  552.     //---- strip trailing whitespace, blank, tab or new line
  553.     if (Isspace((*text)[to-1]))
  554.     to= max(0, --to);
  555.  
  556.     switch (just) {
  557.     case eCenter:
  558.     return (GetInnerExtent().x - text->TextWidth(from,to))/2;
  559.     case eRight:
  560.     return GetInnerExtent().x - text->TextWidth(from,to);
  561.     }
  562.     return 0;
  563. }
  564.  
  565. void StaticTextView::ChangedAt(int line, int, bool redrawAll, int minUpto)
  566.     int start, to;
  567.  
  568.     LineMark_lineChanged= FALSE;
  569.     
  570.     to= formatter->DoIt(line, cMaxInt, minUpto);
  571.     start= formatter->StartedAt();
  572.     nLines= max(nLines, to+1);
  573.     
  574.     if (vertExtend || horExtend)
  575.     Fit(); 
  576.     if (redrawAll || LineMark_lineChanged)
  577.     to= nLines-1;
  578.     InvalidateRange(start, max(to, start));
  579. }
  580.  
  581. void StaticTextView::InvalidateRange(int from, int to)
  582. {
  583.     if (from > to)  // normalize range
  584.     swap(from, to);
  585.     Point p= LineToPoint(from),
  586.       t= Point(contentRect.extent.x, LineToPoint(to).y+LineHeight(to));
  587.     Rectangle r= NormRect(p, t);
  588.  
  589.     r += GetInnerOrigin();
  590.     if (from == 0)  { // consider border
  591.     r.origin.y -= border.y;
  592.     r.extent.y += border.y;
  593.     }
  594.     if (to == nLines-1 || to == 0) 
  595.     r.extent.y += border.y;
  596.     InvalidateRect(r.Expand(Point(max(4,border.x),0)));
  597. }
  598.  
  599. void StaticTextView::InvalidateRange(int from, Point fp, int to, Point tp)
  600. {
  601.     Rectangle r, r1;
  602.  
  603.     from= range(0, nLines, from);
  604.     to=   range(0, nLines, to);
  605.  
  606.     if ((from == to && fp.x > tp.x) || from > to) { // normalize range
  607.     swap(from, to);
  608.     Swap(fp, tp);   
  609.     }
  610.  
  611.     if (from == to) { // optimize invalidate on one line
  612.     r= Rectangle(LineToPoint(from)+Point (fp.x,0),
  613.                     Point(tp.x-fp.x, LineHeight(from)));
  614.     if (from == 0)  { // consider border
  615.         r.origin.y -= border.y;
  616.         r.extent.y += border.y;
  617.     }
  618.     if (to == nLines-1 || to == 0) 
  619.         r.extent.y += border.y;
  620.     r.origin+= GetInnerOrigin();
  621.     InvalidateRect(r.Expand(Point(max(4,border.x),0)));
  622.     return;
  623.     }
  624.     InvalidateRange(from, to);
  625. }
  626.  
  627. void StaticTextView::Dump()
  628. {
  629.     drawViewBorder = TRUE;    
  630.     cerr << "Lines: " << nLines NL;
  631.     cerr << "Contents:\n"<< *text NL;
  632.     for (int i = 0; i < nLines; i++)
  633.     cerr << i << "." << (*lines)[i]->ClassName(), (*lines)[i]->DisplayOn(cerr), cerr NL;;
  634. }
  635.  
  636. char *StaticTextView::AsString()
  637. {
  638.     return text->AsString();
  639. }
  640.  
  641. ostream& StaticTextView::PrintOn (ostream&s)
  642. {
  643.     View::PrintOn(s);
  644.     return s << text SP << wrap SP << spacing SP << just SP << 
  645.         vertExtend SP << horExtend SP << border SP << contentRect.extent;
  646. }
  647.  
  648. istream& StaticTextView::ReadFrom(istream &s)
  649. {
  650.     Text *txt;
  651.     bool wrap, vExtend, hExtend;
  652.     Point extent, itsBorder;
  653.     eSpacing sp;
  654.     eTextJust just;
  655.     Rectangle r;
  656.  
  657.     SafeDelete(text);
  658.  
  659.     View::ReadFrom(s);
  660.     s >> txt >> Bool(wrap) >> Enum(sp) >> Enum(just) >> Bool(vExtend)
  661.                     >> Bool(hExtend) >> itsBorder >> extent;
  662.     r= Rectangle(extent);
  663.     if (vExtend)
  664.     r.extent.y = cFit;
  665.     if (hExtend)
  666.     r.extent.x = cFit;
  667.  
  668.     Init(r, txt, just, sp, wrap, eTextViewNone, itsBorder);
  669.     return s;
  670. }
  671.  
  672. void StaticTextView::AddMark(Mark *m)
  673. {
  674.     text->AddMark(m);
  675. }
  676.  
  677. Mark *StaticTextView::RemoveMark(Mark *m)
  678. {
  679.     return text->RemoveMark(m);
  680. }
  681.  
  682. Iterator *StaticTextView::GetMarkIter()
  683. {
  684.     return text->GetMarkIter();
  685. }
  686.  
  687. MarkList *StaticTextView::GetMarkList()
  688. {
  689.     return text->GetMarkList();
  690. }
  691.  
  692. int StaticTextView::OutOfRangeLineMetric(bool lineHeight)
  693. {
  694.     if (lineHeight)
  695.     return TextViewLineHeight(text->GetFont(), spacing);  
  696.     return text->GetFont()->Ascender();      
  697. }
  698.  
  699. void StaticTextView::InspectorId(char *buf, int sz)
  700. {
  701.     if (text)
  702.     text->InspectorId(buf, sz);
  703.     else
  704.     View::InspectorId(buf, sz);
  705. }
  706.  
  707. void StaticTextView::Parts(Collection* col)
  708. {
  709.     View::Parts(col);
  710.     col->Add(text);
  711. }        
  712.